Работа
с таймером, временем,
датами.
Нам необходимо управлять временем для работы с анимацией, а также для решения полезных и интересных задач. Собственно, все игры с одновременным движением персонажей делаются с помощью таймера.
Тип данных Date
Познакомимся с новым типом данных - Date. Вы пока знакомы с числовыми и строковым типами. Тип Date тоже в принципе числовой, но, сами понимаете, специфический. Если, например, в нем к 0:40 прибавить 0:40, то получится 1:20.
Когда вы пишете в окне кода программу, в ней встречаются числа, строки, а теперь вы должны научиться писать в программе дату и время суток.
Чтобы Visual Basic понял, что перед ним число, вы просто пишете число, и он понимает. Чтобы Visual Basic понял, что перед ним строка, вы пишете строку и берете ее в двойные кавычки, и он понимает, что это строка. Чтобы Visual Basic понял, что перед ним да та или время суток, вы правильно записываете дату и время и заключаете их между значками #, и он понимает. Например, так: #2/16/2002# - 16 февраля 2002 года. Как правильно записывать дату и время в других случаях, вы поймете из примеров:
Dim D As Date
Dim T As Date
Dim DT As Date
Private Sub Command1_Click()
Print #6/25/2001# '25 июня 2001 года
Print #2:22:57 PM# '2 ч 22 мин 57 сек после полудня (РМ)
Print #2/28/2009 10:45:00 РМ# '10 ч 45 мин вечера 28 февр. 2009г.
D = #12/25/2044#
Т = #2:00:32 АМ# '2 ч 00 мин 32 сек до полудня (AM)
DT= #1/15/2156 11:59:42РМ#
Print D, T, DT
End Sub
Функции для работы с датами и временем суток
Функция . |
Результат |
Print Date |
Печатается сегодняшнее число (то, что на панели задач Windows) |
Print Time |
Печатается который сейчас час |
Print Now |
Печатается сегодняшнее число и который сейчас час |
Пусть D = # 2/14/2009 4:45:07 РМ # (это суббота), тогда:
Print DatePartfm("m", D) |
(функция выделяет из даты номер месяца в году)
Print DatePart("q", D) |
(функция выделяет из даты номер квартала в году)
Print DatePart("s", D) |
(функция выделяет из даты номер секунды в минуте) |
Print DatePart("w", D) |
(функция выделяет из даты номер дня в неделе, но делает это по-американски, а в США 1-й день недели -воскресенье, значит,7-й - суббота) |
Print DatePart("w", D, vbMonday)) |
(а здесь мы попросили функцию считать 1-м днем недели понедельник (vbMonday), и поэтому результат она выдала привычный для нас - 6-й день - суббота) |
Значением функции DatePart является число типа Integer, а не дата.
Все возможные значения строкового параметра для функций работы с датами приведены ниже.
Print DateAdd("s", 10, D) |
14.02.0916:45:17 (функция добавляет к дате 10 с)
Print DateAdd("m",-1, D) |
14.01.0916:45:07 (функция вычитает из даты 1 месяц)
Пусть D1 = #2/14/2009 4:45:07 РМ#, D2 = #2/16/2009 11:32:43 АМ#, тогда:
Print DateDiff("h",D1,D2) |
43 (количество часов, прошедших с момента даты D1 до момента даты D2)
Print Timer |
53861,97 (количество секунд, прошедших с полуночи. Не путайте функцию Timer с элементом управления Timer. Результат выдается, как видите, с двумя знаками после запятой, но не верьте сотым долям, десятые же более-менее точны) |
Print NIonthName (5) |
Май |
Print WeekdayName (4) |
Четверг (как видите, работает по-нашему, а не по-американски) |
Опасные операторы:
Date = #05/22/2004#
Это не безобидная функция Date, которая только сообщает, какое сегодня число, это оператор Date, который устанавливает системные часы Windows на ту дату, какую вы указали. Ничего особо страшного, конечно, от установки неправильной даты не будет, компьютер не сломается, но вот, например, сохраняемые вами файлы будут иметь неправильную дату сохранения, а это приведет к путанице в вашем файловом хозяйстве. Да и некоторые программы могут начать жаловаться. Отличить функцию от оператора с тем же именем просто - они встречаются по разные стороны знака равенства в операторе присваивания, причем функция всегда справа
Аналогично |
Time = #10:44:00 АМ#
Значения строкового параметра для функций работы
с датами
Строковый параметр |
Смысл |
УУУУ |
Год |
q |
Квартал в году |
ww |
Номер недели в году |
h |
Час в сутках |
n |
Минута в часе |
s |
Секунда в минуте |
Таймер
Создайте новый проект. Поместите на форму таймер. Установите его свойство Interval равным 10000. Сделайте двойной щелчок по таймеру.
В появившуюся заготовку процедуры впишите одну строчку:
Private Sub Timer1_Timer()
Debug.Print "Процедура сработала"
End Sub
Запустите проект. Подождите немного. Через 10 с в окне Immediate появится строчка "Процедура сработала". Еще через 10 с появится такая же строчка, через 10 с - еще одна и т. д.
Если бы мы установили Interval равным 5000, то строчки появлялись бы каждые 5 с, а если равным 500, то - каждые 0.5 с.
Таймер - объект, вся работа которого заключается в том, чтобы через каждые Interval секунд создавать событие (импульс), которое запускает процедуру Timer1_Timer.
Таймеров в проекте может быть несколько. Все они работают независимо друг от друга, и каждый имеет свою собственную процедуру, которая реагирует только на его импульсы.
Цикл без цикла
В процедуре Timer1_Timer мы можем написать все, что угодно.
Например:
Dim i As Long
Private Sub Timerl _Timer()
Print "Процедура сработала", i
i=i+1
End Sub У
становите Interval в 1000.
Запустите проект.
Пояснение. Поскольку мы нигде не придали переменной i никакого значения, Visual Basic при первой встрече с ней в операторе Print посчитал ее равной нулю.
После первого выполнения процедуры Timer1_timer переменная i стала равной единице, после второго - двум. И так далее.
Мы видим, что у нас заработал цикл, несмотря на то что операторов цикла мы не писали!
Установим свойство таймера Enabled (порусски - "в рабочем состоянии") в False. Запустим проект. Никаких строк не появляется. Значит, таймер выдает импульсы только тогда, когда свойство Enabled установлено в True.